Skip to main content

1. Prompt Template

Written: 2026.06 在与大语言模型交互时,通常不会直接将用户的原始输入直接传递给大模型,而是会先进行一系列包装、组织和格式化操作。这样做的目的是:更清晰地表达用户意图,更好地利用模型能力

1.1 提示词模板介绍

1.1.1 为什么需要提示词模板

这套结构化的提示词构建方式,就是 LangChain 中的 提示词模板(PromptTemplate),对于 LLM 应用来说,好的提示词就是成功的一半。更多提示词技巧可参考文档:https://www.cuiliangblog.cn/detail/section/228046450 LangChain 提示词官方文档参考:https://reference.langchain.com/python/langchain_core/prompts/

1.1.2 提示词模板分类

LangChain 提供了多种不同的提示词模板,下面介绍几种常用的提示词模板:
  • PromptTemplate:文本生成模型提示词模板,用字符串拼接变量生成提示词
  • ChatPromptTemplate:聊天模型提示词模板,适用于如 gpt-3.5-turbogpt-4 等聊天模型
  • HumanMessagePromptTemplate:人类消息提示词模板
  • SystemMessagePromptTemplate:系统消息提示词模板
  • FewShotPromptTemplate:少样本学习提示词模板, 构建一个 Prompt,其中包含多个 示例,可以 自动将这些示例格式化并插入到主 Prompt 中 。
  • PipelinePrompt:管道提示词模板,用于把几个提示词组合在一起使用。

1.1.3 提示词模板类继承关系

分析LangChain源码可知,在LangChain的类结构中,顶层基类是 BasePromptTemplate,用于定义Prompt模板系统必须实现的核心方法,而StringPromptTemplate 和 BaseChatPromptTemplate两个子类分别继承该顶层基类
提示词模板类继承关系

提示词模板类继承关系

接入聊天模型时需继承BaseChatPromptTemplate;而文本生成模型则继承StringPromptTemplate

1.2 文本提示词模板

PromptTemplate 针对文本生成模型的提示词模板,也是LangChain提供的最基础的模板,通过格式化字符串生成提示词,在执行invoke时将变量格式化到提示词模板中 主要参数: template:定义提示词模板的字符串,其中包含文本和变量占位符(如{name}) input_variables: 列表,指定了模板中使用的变量名称,在调用模板时被替换 partial_variables:字典,用于定义模板中一些固定的变量名。这些值不需要再每次调用时被替换 函数介绍: format():给input_variables变量赋值,并返回提示词。利用format() 进行格式化时就一定要赋值,否则会报错。当在template中未设置input_variables,则会自动忽略。

1.3 创建文本提示词

1.3.1 使用构造方法

使用构造方法
输出格式化后的提示词内容:

1.3.2 调用 from_template(常用)

调用from_template
输出生成的提示词

1.3.3 部分提示词模板

部分提示词,顾名思义就是允许你预先固定部分变量,而保留其他变量在后续动态填充。例如:先预设系统参数,然后等用户输入后再补齐提示词模板。
部分提示词
然后格式化问题生成最终提示词

1.3.4 组合提示词模板

通过将多个子提示(Prompt)按一定逻辑顺序或层级组合起来,形成一个复杂任务的整体 Prompt。例如实现多消息对话、多阶段任务、多输入源组合等场景。
组合提示词模板
填充组合后模板的占位符,生成最终的提示词

1.4 文本提示词方法

上述的代码示例中,我们使用了format方法,除了format方法能够格式化提示词模板,invoke()和partial()方法也可以做到,以下是它们的作用: invoke:格式化提示词模板为PromptValue format:格式化提示词模板为字符串 partial:格式化提示词模板为一个新的提示词模板,可以继续进行格式化

1.4.1 format

format() 方法用法如下,将 question 参数格式化到提示词模板中,返回一个字符串:
format()方法
输出生成的提示词

1.4.2 partial

partial()方法用法如下,可以格式化部分变量,并且继续返回一个模板,通常在部分提示词模板场景下使用
partial
输出生成的提示词

1.4.3 invoke

invoke() 是 LangChain Expression Language(LCEL 的统一执行入口,用于执行任意可运行对象(Runnable )。返回的是一个 PromptValue 对象,可以用 .to_string() 或 .to_messages() 查看内容
invoke()方法
to_string()方法将PromptValue转换为可读的字符串格式

1.5 对话提示词模板

ChatPromptTemplate 是专为聊天模型(如 gpt-3.5-turbogpt-4 等)设计的提示词模板,它支持构造多轮对话的消息结构,每条消息可指定角色(如系统、用户、AI)。 特点:
  • 支持 System / Human / AI 等不同角色的消息模板
  • 对话历史维护
参数类型:列表参数格式是tuple类型( role :str content :str 组合最常用) 元组的格式为:(role: str | type, content: str | list[dict] | list[object]) 其中 role 是:字符串(如 “system” 、“human” 、“ai” )

1.6 创建对话提示词

1.6.1 使用构造方法

创建提示词-构造方法
user_input: 用户的当前输入

1.6.2 调用 from_messages(常用)

代码示例如下,提示词模板中包含两条消息,第一条是系统消息,无需做提示词渲染,第二条是人类消息,在执行invoke时,需要把变量question渲染进去。
调用form_message
输出生成的提示内容

1.7 对话提示词方法

除了之前在 PromptTemplate介绍的 format、partial、invoke外,还有 format_messages 和 format_prompt方法。

1.7.1 format_messages

作用:将模板变量替换后,直接生成 消息列表(List[BaseMessage]),一般包含:SystemMessage``HumanMessage``AIMessage 常用场景:用于手动查看或调试 Prompt 的最终“消息结构”,或者自己拼接进 Chain。 代码如下
format_message
打印格式化后的提示消息

1.7.2 format_prompt

作用:生成一个 PromptValue 对象,这是一种抽象层次更高的封装。
  • 对于 PromptTemplate(单纯文本),返回 StringPromptValue
  • 对于 ChatPromptTemplate(对话模板),返回 ChatPromptValue
PromptValue 有两个常用方法:
  • .to_string() → 转成文本
  • .to_messages() → 转成消息列表(同上)
返回值:PromptValue 对象 代码如下
format_prompt
将提示转换为消息列表并打印

1.8 对话提示词实例化参数类型

前面讲了ChatPromptTemplate的两种创建方式。我们看到不管使用构造方法,参数类型都是列表类型。参数除了是列表类型,列表的元素可以是字符串、字典、字符串构成的元组、消息类型、提示词模板类型、消息提示词模板类型等

1.8.1 str 类型

列表参数格式是str类型(不推荐),因为默认都是HumanMessage。 代码如下
str 类型
打印格式化后的消息内容

1.8.2 dict 类型

列表参数格式是dict类型,代码如下:
dict 类型
打印格式化后的消息内容

1.8.3 message 类型

System/Human/AIMessage 是 langchain 中用于构建不同角色的一个类。它通常用于创建聊天消息的一部分,特别是当你构建一个多轮对话的 prompt 模板时,区分系统、AI、和人类消息。 代码如下
message 类型
打印格式化后的消息内容

1.8.4 BaseChatPromptTemplate 类型

使用 BaseChatPromptTemplate,可以理解为ChatPromptTemplate里嵌套了ChatPromptTemplate。
BaseChatPromptTemplate 类型
打印生成的消息内容

1.8.5 BaseMessagePromptTemplate 类型

LangChain提供不同类型的MessagePromptTemplate。最常用的是SystemMessagePromptTemplate 、HumanMessagePromptTemplate 和AIMessagePromptTemplate ,分别创建系统消息、人工消息和AI消息,它们是ChatMessagePromptTemplate的特定角色子类。 基本概念: HumanMessagePromptTemplate,专用于生成用户消息(HumanMessage) 的模板类,是ChatMessagePromptTemplate的特定角色子类。
  • 本质:预定义了 role=“human” 的 MessagePromptTemplate,且无需无需手动指定角色
  • 模板化:支持使用变量占位符,可以在运行时填充具体值
  • 格式化:能够将模板与输入变量结合生成最终的聊天消息
  • 输出类型:生成 HumanMessage 对象( content + role=“human” )
  • 设计目的 :简化用户输入消息的模板化构造,避免重复定义角色
SystemMessagePromptTemplate、AIMessagePromptTemplate:类似于上面,不再赘述 ChatMessagePromptTemplate,用于构建聊天消息的模板。它允许你创建可重用的消息模板,这些模板可以动态地插入变量值来生成最终的聊天消息
  • 角色指定:可以为每条消息指定角色(如 “system”、“human”、“ai”) 等,角色灵活。
  • 模板化:支持使用变量占位符,可以在运行时填充具体值
  • 格式化:能够将模板与输入变量结合生成最终的聊天消息
示例代码如下
BaseMessagePromptTemplate 类型
格式化消息并打印结果

1.9 少量样本提示词模板

1.9.1 FewShotPromptTemplate

FewShotPromptTemplate 用于:
  • 构建一个 Prompt,其中包含多个 示例(examples);
  • 自动将这些示例格式化并插入到主 Prompt 中;
  • 实现 Few-Shot Prompting 方式,以增强大模型在特定任务(如分类、问答、翻译等)上的表现。
它通常由以下几部分构成:
  1. examples:少量的人工示例(dict 列表);
  2. example_prompt:如何格式化每个示例(使用 PromptTemplate);
  3. prefix:示例之前的文字说明(可选);
  4. suffix:用户真正的问题模板;
  5. input_variables:最终 suffix 中需要传入的变量。
假设开发一个提取语句城市名称的AI:
FewShotPromptTemplate
生成最终的 prompt

1.9.2 FewShotChatMessagePromptTemplate

除了FewShotPromptTemplate之外,FewShotChatMessagePromptTemplate是专门为 聊天对话场景设计的少样本(few-shot)提示模板,它继承自 FewShotPromptTemplate ,但针对聊天消息的格式进行了优化。 特点:
  • 自动将示例格式化为聊天消息( HumanMessage / AIMessage 等)
  • 输出结构化聊天消息( List[BaseMessage] )
  • 保留对话轮次结构
代码如下
FewShotChatMessagePromptTemplate
运行结果如下
格式化并打印最终提示模板,传入具体问题'3✖️2'

1.9.3 Example selectors

前面FewShotPromptTemplate的特点是,无论输入什么问题,都会包含全部示例。在实际开发中,我们可以根据当前输入,使用示例选择器,从大量候选示例中选取最相关的示例子集。 使用的好处:避免盲目传递所有示例,减少 token 消耗的同时,还可以提升输出效果。 示例选择策略:语义相似选择、长度选择、最大边际相关示例选择等
  • 语义相似选择:通过余弦相似度等度量方式评估语义相关性,选择与输入问题最相似的 k 个示例。
  • 长度选择:根据输入文本的长度,从候选示例中筛选出长度最匹配的示例。增强模型对文本结构的理解。比语义相似度计算更轻量,适合对响应速度要求高的场景。
  • 最大边际相关示例选择:优先选择与输入问题语义相似的示例;同时,通过惩罚机制避免返回同质化的内容。
代码如下
Example selectors
格式化提示模板,将'开心'作为输入生成最终提示字符串

1.10 消息占位符提示词模板

如果我们不确定消息何时生成,也不确定要插入几条消息,比如在提示词中添加聊天历史记忆这种场景,可以在ChatPromptTemplate添加MessagesPlaceholder占位符,在调用invoke时,在占位符处插入消息。

1.10.1 使用 MessagesPlaceholder

使用MessagesPlaceholder
打印生成的完整 prompt 文本,格式化后的聊天记录

1.10.2 隐式使用 MessagesPlaceholder

"placeholder" 是 ("placeholder", "{memory}") 的简写语法,等价于 MessagesPlaceholder("memory")
隐式使用MessagesPlaceholder
使用 .to_string() 将格式化后的对话链转换成纯文本字符串,方便查看输出

1.11 提示词模板仓库

LangChain Hub 是一个公共的 prompt(提示词)仓库,访问地址是https://smith.langchain.com/hub。类似 HuggingFace Hub,但是专门存放 LangChain 的 Prompt、Chains、Tools 等。我们可以在 hub 中搜索通用的提示词模板并使用。代码如下:
提示词模板仓库
或者访问具体字段